import { HttpStatusCodes } from '../enum'
import { PagePath } from '@/common/constants'
import { useUserStore } from '@/common/store'
import type { Result } from '@/common/types/request'

/**
 * 接口请求地址
 */
const baseURL = import.meta.env.HOPE_API_BASE_URL
console.log(`baseURL:${baseURL}`)

/**
 * 拦截器配置
 */
const httpInterceptor = {
  /**
   * 拦截前触发
   * @param option
   */
  invoke(options: UniApp.RequestOptions) {
    // 非http开头需要拼接地址
    if (!options.url.startsWith('http')) {
      options.url = baseURL + options.url
    }
    // 请求超时
    options.timeout = 10000
    // 请求头配置
    options.header = {
      // 保留请求时设置的请求头
      ...options.header,
    }

    // 添加 token 请求头标识
    const { hope_token } = useUserStore()
    if (hope_token)
      options.header.authorization = hope_token
  },
}

// 拦截 request 请求
uni.addInterceptor('request', httpInterceptor)

// 拦截 uploadFile 文件上传
uni.addInterceptor('uploadFile', httpInterceptor)

/**
 * 请求函数
 * @param  UniApp.RequestOptions
 * @returns Promise
 *  1. 返回 Promise 对象，用于处理返回值类型
 *  2. 获取数据成功
 *    2.1 提取核心数据 res.data
 *    2.2 添加类型，支持泛型
 *  3. 获取数据失败
 *    3.1 401错误  -> 清理用户信息，跳转到登录页
 *    3.2 其他错误 -> 根据后端错误信息轻提示
 *    3.3 网络错误 -> 提示用户换网络
 */

// 2.2 添加类型，支持泛型
/**
 * 请求
 * @param options
 * @author lian
 */
export const useRequest = <T>(options: UniApp.RequestOptions) => {
  // 1. 返回 Promise 对象
  return new Promise<Result<T>>((resolve, reject) => {
    uni.showLoading({
      title: '加载中',
    })
    setTimeout(() => {
      uni.request({
        ...options,
        // 响应成功
        success(res) {
          // 状态码 2xx，参考 axios 的设计
          if (res.statusCode >= 200 && res.statusCode < 300) {
            // 2.1 提取核心数据 res.data
            resolve(res.data as Result<T>)
          }
          else if (res.statusCode === HttpStatusCodes.UNAUTHORIZED || res.statusCode === HttpStatusCodes.BAD_REQUEST) {
            // 401错误  -> 清理用户信息，跳转到登录页
            const { clearUserInfo } = useUserStore()
            clearUserInfo()

            // 弹出模态框
            uni.showModal({
              title: TIPS,
              content: PLEASE_LOGIN,
              cancelText: BACK_HOME,
              confirmText: GOTO_LOGIN,
              success(result) {
                if (result.confirm) {
                  // 跳转登录页
                  return uni.navigateTo({
                    url: PagePath.LOGIN,
                  })
                }

                // 跳转到首页
                uni.switchTab({
                  url: PagePath.HOME,
                })
              },
            })

            reject(res)
          }
          else {
            // 其他错误 -> 根据后端错误信息轻提示
            showSimpleToast((res.data as Result<T>).message || REQUEST_FAIL)
            reject(res)
          }
        },
        // 响应失败
        fail(err) {
          showSimpleToast(NETWORK_FAIL)
          reject(err)
        },
      })
      uni.hideLoading()
    }, 1500)
  })
}

export default useRequest
